#include "System.h"

using namespace std;

//路径查询骨架
void System::searchPathGujia()
{
    int op = -1;
    string pointbe, pointen;
    while (1) {
        op = searchPath(pointbe, pointen);

        switch (op)
        {
        case 0://起点-终点的多条路径页面骨架
            pathShowGujia(pointbe, pointen);
            break;
        case 1://退出
            return;
            break;

        default:
            break;
        }
    }
}

//路径查询输入框页面
int System::searchPath(string& be,string& en)
{
    setbkcolor(RGB(255, 255, 255));
    cleardevice();
    //顶栏设置
    setfillcolor(RGB(130, 226, 255)); //设置矩形白色
    fillroundrect(0, 0, 375, 83, 0, 0);
    settextcolor(RGB(0, 72, 125));
    settextstyle(36, 0, "黑体");//设置文本大小，垂直压缩，字体
    setbkmode(TRANSPARENT);//去除文字背景
    outtextxy(113, 20, "路径查询");
    IMAGE retn;
    loadimage(&retn, "./返回.png", 16, 29);
    putimage(25, 27, &retn);


    //下栏图标设置
    IMAGE Chaxun;
    loadimage(&Chaxun, "./地图.png", 51, 48);
    putimage(162, 730, &Chaxun);
    setlinecolor(RGB(15, 19, 174));
    line(27, 755, 145, 755);
    line(230, 755, 348, 755);

    //按钮设置
    BasicButton btn1(112, 322, 152, 64, 10, "查询");
    btn1.setbtncl(96, 211, 225);
    btn1.settext(0, 72, 125, 32, 157, 336);
    btn1.show();

    //输入框设置
    settextcolor(RGB(0, 0, 0));
    settextstyle(32, 0, "黑体");//设置文本大小，垂直压缩，字体
    setbkmode(TRANSPARENT);//去除文字背景
    outtextxy(27, 145, "起点：");
    outtextxy(27, 223, "终点：");

    Textbox tb1(123, 135, 225, 57, "", 5);
    tb1.settitle("请输入起点：");
    tb1.show();
    Textbox tb2(123, 213, 225, 57, "", 5);
    tb2.settitle("请输入终点：");
    tb2.show();

    //持续循环直到获取鼠标点击按钮的信号
    while (1) {
        if (Window::havemsg()) {
            m_msg = Window::getmsg();
            if (m_msg.x >= 0 && m_msg.x <= 68 && m_msg.y >= 0 && m_msg.y <= 83) {
                if (m_msg.message == WM_LBUTTONDOWN) { //点击返回键，回到主页功能骨架
                    return 1; //返回1时在查询路径骨架中继续退出，回到主页功能骨架
                }
            }

            btn1.setmsg(m_msg);
            if (btn1.isCliked()) { //点击了查询按钮
                be = tb1.gettext();
                en = tb2.gettext(); //取出起点和终点
                return 0; //返回0时在查询路径骨架中调用多路径显示页面
            }

            tb1.setmsg(m_msg); //起点输入
            if (tb1.isCliked()) {
                tb1.updatetext(0);
            }

            tb2.setmsg(m_msg); //终点输入
            if (tb2.isCliked()) {
                tb2.updatetext(0);
            }
        }
    }
}

//多条路径显示页面骨架
void System::pathShowGujia(string begin, string end)
{
    int op = 1;
    while (1) {

        switch (op)
        {
        case 1://首次进入时默认显示步行页面
            op = pathShow(begin, end);
            break;
        case 2://骑行页面
            op = pathShow2(begin, end);
            break;
        case 3://校车页面
            op = pathShow3(begin, end);
            break;
        case 0://退出
            return;
            break;
        default:
            break;
        }
    }
}

//多条路径显示页面（默认步行页面）
int System::pathShow(string begin, string end)
{
    setbkcolor(RGB(255, 255, 255));
    cleardevice();
    //顶栏设置
    setfillcolor(RGB(130, 226, 255)); //设置矩形白色
    fillroundrect(0, 0, 375, 83, 0, 0);
    settextcolor(RGB(0, 72, 125));
    settextstyle(36, 0, "黑体");//设置文本大小，垂直压缩，字体
    setbkmode(TRANSPARENT);//去除文字背景
    outtextxy(113, 20, "路径查询");

    //下栏图标设置
    IMAGE Chaxun;
    loadimage(&Chaxun, "./地图.png", 51, 48);
    putimage(162, 730, &Chaxun);
    setlinecolor(RGB(15, 19, 174));
    line(27, 755, 145, 755);
    line(230, 755, 348, 755);

    //按钮设置
    BasicButton btn1(26, 100, 79, 40, 10, "步行");
    btn1.setbtncl(96, 218, 255);
    btn1.settext(0, 72, 125, 32, 34, 103);
    btn1.show();

    BasicButton btn2(148, 100, 79, 40, 10, "骑行");
    btn2.setbtncl(255, 255, 255);
    btn2.settext(0, 72, 125, 32, 156, 103);
    btn2.show();

    BasicButton btn3(270, 100, 79, 40, 10, "校车");
    btn3.setbtncl(255, 255, 255);
    btn3.settext(0, 72, 125, 32, 278, 103);
    btn3.show();

    //采用算法得出所有路径并依次显示各个路径卡片
    auto it1 = SceneryKu.find(begin);
    Dot* source = it1->second; //从景点库中找到起点
    auto it2 = SceneryKu.find(end);
    Dot* target = it2->second; //从景点库中找到终点
    vector<double>pathlength;
    vector<vector<Dot*>>allpaths = FindRoot(source, target, pathlength); //获得路径

    if (pathlength.size() == 0) { //不存在路径
        settextcolor(RGB(120, 120, 120));
        settextstyle(40, 0, "黑体");//设置文本大小，垂直压缩，字体
        setbkmode(TRANSPARENT);//去除文字背景
        outtextxy(66, 382, "不存在路径！");
    }
    else {
        int texty = 194;
        int liney = 252;
        for (int i = 0; i < allpaths.size(); ) {
            settextcolor(RGB(0, 0, 0));
            settextstyle(32, 0, "黑体");//设置文本大小，垂直压缩，字体
            setbkmode(TRANSPARENT);//去除文字背景
            string pathnum = to_string(i+1);
            string text = "路线";
            text.append(pathnum);
            outtextxy(63, texty, text.c_str()); //输出“路线x”
            int l = pathlength[i] * 7.5;
            string len = to_string(l); //路径长
            len.append("m");
            outtextxy(202, texty, len.c_str()); //输出“xxxm”

            setlinecolor(RGB(0, 0, 0));
            line(30, liney, 345, liney);

            i++;
            texty += 104;
            liney += 104; //输出下一路径时的显示位置
        }
    }
    

    //持续循环直到获取鼠标点击按钮的信号
    while (1) {
        if (Window::havemsg()) {
            m_msg = Window::getmsg();
            if (m_msg.x >= 0 && m_msg.x <= 68 && m_msg.y >= 0 && m_msg.y <= 83) {
                if (m_msg.message == WM_LBUTTONDOWN) { //点击返回键，回到查询输入框页面
                    return 0; //返回0，在pathShowGujia中进入case 0，退出到searchPathGujia()，显示路径查询输入框页面
                }
            }

            btn2.setmsg(m_msg);
            if (btn2.isCliked()) { //点击了骑行按钮
                return 2;//返回2，在pathShowGujia中进入case 2，调用骑行页面
            }
            btn3.setmsg(m_msg);
            if (btn3.isCliked()) { //点击了校车按钮
                return 3;//返回2，在pathShowGujia中进入case 3，调用校车页面
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 175 && m_msg.y <= 252 && 1<=pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线1并点击它
                    onePathShow(begin, end, pathlength[0], allpaths[0], WalkingVelocity, 1);
                    //调用onePathShow显示路线1详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 279 && m_msg.y <= 356 && 2 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线2并点击它
                    onePathShow(begin, end, pathlength[1], allpaths[1], WalkingVelocity, 0);
                    //调用onePathShow显示路线2详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 383 && m_msg.y <= 460 && 3 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线3并点击它
                    onePathShow(begin, end, pathlength[2], allpaths[2], WalkingVelocity, 0);
                    //调用onePathShow显示路线3详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 487 && m_msg.y <= 564 && 4 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线4并点击它
                    onePathShow(begin, end, pathlength[3], allpaths[3], WalkingVelocity, 0);
                    //调用onePathShow显示路线4详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 591 && m_msg.y <= 668 && 5 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线5并点击它
                    onePathShow(begin, end, pathlength[4], allpaths[4], WalkingVelocity, 0);
                    //调用onePathShow显示路线5详细信息函数
                }
            }
        }
    }
}

//多条路径显示页面（骑行页面）
int System::pathShow2(string begin, string end)
{
    setbkcolor(RGB(255, 255, 255));
    cleardevice();
    //顶栏设置
    setfillcolor(RGB(130, 226, 255)); //设置矩形白色
    fillroundrect(0, 0, 375, 83, 0, 0);
    settextcolor(RGB(0, 72, 125));
    settextstyle(36, 0, "黑体");//设置文本大小，垂直压缩，字体
    setbkmode(TRANSPARENT);//去除文字背景
    outtextxy(113, 20, "路径查询");

    //下栏图标设置
    IMAGE Chaxun;
    loadimage(&Chaxun, "./地图.png", 51, 48);
    putimage(162, 730, &Chaxun);
    setlinecolor(RGB(15, 19, 174));
    line(27, 755, 145, 755);
    line(230, 755, 348, 755);

    //按钮设置
    BasicButton btn1(26, 100, 79, 40, 10, "步行");
    btn1.setbtncl(255, 255, 255);
    btn1.settext(0, 72, 125, 32, 34, 103);
    btn1.show();

    BasicButton btn2(148, 100, 79, 40, 10, "骑行");
    btn2.setbtncl(96, 218, 255);
    btn2.settext(0, 72, 125, 32, 156, 103);
    btn2.show();

    BasicButton btn3(270, 100, 79, 40, 10, "校车");
    btn3.setbtncl(255, 255, 255);
    btn3.settext(0, 72, 125, 32, 278, 103);
    btn3.show();

    //采用算法得出所有路径并依次显示各个路径卡片
    auto it1 = SceneryKu.find(begin);
    Dot* source = it1->second; //从景点库中找到起点
    auto it2 = SceneryKu.find(end);
    Dot* target = it2->second; //从景点库中找到终点
    vector<double>pathlength;
    vector<vector<Dot*>>allpaths = FindRoot(source, target, pathlength); //获得路径

    if (pathlength.size() == 0) { //不存在路径
        settextcolor(RGB(120, 120, 120));
        settextstyle(40, 0, "黑体");//设置文本大小，垂直压缩，字体
        setbkmode(TRANSPARENT);//去除文字背景
        outtextxy(66, 382, "不存在路径！");
    }
    else {
        int texty = 194;
        int liney = 252;
        for (int i = 0; i < allpaths.size(); ) {
            settextcolor(RGB(0, 0, 0));
            settextstyle(32, 0, "黑体");//设置文本大小，垂直压缩，字体
            setbkmode(TRANSPARENT);//去除文字背景
            string pathnum = to_string(i + 1);
            string text = "路线";
            text.append(pathnum);
            outtextxy(63, texty, text.c_str()); //输出“路线x”
            int l = pathlength[i] * 7.5;
            string len = to_string(l); //路径长
            len.append("m");
            outtextxy(202, texty, len.c_str()); //输出“xxxm”

            setlinecolor(RGB(0, 0, 0));
            line(30, liney, 345, liney);

            i++;
            texty += 104;
            liney += 104; //输出下一路径时的显示位置
        }
    }


    //持续循环直到获取鼠标点击按钮的信号
    while (1) {
        if (Window::havemsg()) {
            m_msg = Window::getmsg();
            if (m_msg.x >= 0 && m_msg.x <= 68 && m_msg.y >= 0 && m_msg.y <= 83) {
                if (m_msg.message == WM_LBUTTONDOWN) { //点击返回键，回到查询输入框页面
                    return 0; //返回0，在pathShowGujia中进入case 0，退出到searchPathGujia()，显示路径查询输入框页面
                }
            }

            btn1.setmsg(m_msg);
            if (btn1.isCliked()) { //点击了步行按钮
                return 1;//返回1，在pathShowGujia中进入case 1，调用步行页面
            }
            btn3.setmsg(m_msg);
            if (btn3.isCliked()) { //点击了校车按钮
                return 3;//返回3，在pathShowGujia中进入case 3，调用校车页面
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 175 && m_msg.y <= 252 && 1 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线1并点击它
                    onePathShow(begin, end, pathlength[0], allpaths[0], CyclingVelocity, 1);
                    //调用onePathShow显示路线1详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 279 && m_msg.y <= 356 && 2 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线2并点击它
                    onePathShow(begin, end, pathlength[1], allpaths[1], CyclingVelocity, 0);
                    //调用onePathShow显示路线2详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 383 && m_msg.y <= 460 && 3 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线3并点击它
                    onePathShow(begin, end, pathlength[2], allpaths[2], CyclingVelocity, 0);
                    //调用onePathShow显示路线3详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 487 && m_msg.y <= 564 && 4 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线4并点击它
                    onePathShow(begin, end, pathlength[3], allpaths[3], CyclingVelocity, 0);
                    //调用onePathShow显示路线4详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 591 && m_msg.y <= 668 && 5 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线5并点击它
                    onePathShow(begin, end, pathlength[4], allpaths[4], CyclingVelocity, 0);
                    //调用onePathShow显示路线5详细信息函数
                }
            }
        }
    }
}

int System::pathShow3(string begin, string end)
{
    setbkcolor(RGB(255, 255, 255));
    cleardevice();
    //顶栏设置
    setfillcolor(RGB(130, 226, 255)); //设置矩形白色
    fillroundrect(0, 0, 375, 83, 0, 0);
    settextcolor(RGB(0, 72, 125));
    settextstyle(36, 0, "黑体");//设置文本大小，垂直压缩，字体
    setbkmode(TRANSPARENT);//去除文字背景
    outtextxy(113, 20, "路径查询");

    //下栏图标设置
    IMAGE Chaxun;
    loadimage(&Chaxun, "./地图.png", 51, 48);
    putimage(162, 730, &Chaxun);
    setlinecolor(RGB(15, 19, 174));
    line(27, 755, 145, 755);
    line(230, 755, 348, 755);

    //按钮设置
    BasicButton btn1(26, 100, 79, 40, 10, "步行");
    btn1.setbtncl(255, 255, 255);
    btn1.settext(0, 72, 125, 32, 34, 103);
    btn1.show();

    BasicButton btn2(148, 100, 79, 40, 10, "骑行");
    btn2.setbtncl(255, 255, 255);
    btn2.settext(0, 72, 125, 32, 156, 103);
    btn2.show();

    BasicButton btn3(270, 100, 79, 40, 10, "校车");
    btn3.setbtncl(96, 218, 255);
    btn3.settext(0, 72, 125, 32, 278, 103);
    btn3.show();

    //采用算法得出所有路径并依次显示各个路径卡片
    auto it1 = SceneryKu.find(begin);
    Dot* source = it1->second; //从景点库中找到起点
    auto it2 = SceneryKu.find(end);
    Dot* target = it2->second; //从景点库中找到终点
    vector<double>pathlength;
    vector<vector<Dot*>>allpaths = FindRoot(source, target, pathlength); //获得路径

    if (pathlength.size() == 0) { //不存在路径
        settextcolor(RGB(120, 120, 120));
        settextstyle(40, 0, "黑体");//设置文本大小，垂直压缩，字体
        setbkmode(TRANSPARENT);//去除文字背景
        outtextxy(66, 382, "不存在路径！");
    }
    else {
        int texty = 194;
        int liney = 252;
        for (int i = 0; i < allpaths.size(); ) {
            settextcolor(RGB(0, 0, 0));
            settextstyle(32, 0, "黑体");//设置文本大小，垂直压缩，字体
            setbkmode(TRANSPARENT);//去除文字背景
            string pathnum = to_string(i + 1);
            string text = "路线";
            text.append(pathnum);
            outtextxy(63, texty, text.c_str()); //输出“路线x”
            int l = pathlength[i] * 7.5;
            string len = to_string(l); //路径长
            len.append("m");
            outtextxy(202, texty, len.c_str()); //输出“xxxm”

            setlinecolor(RGB(0, 0, 0));
            line(30, liney, 345, liney);

            i++;
            texty += 104;
            liney += 104; //输出下一路径时的显示位置
        }
    }


    //持续循环直到获取鼠标点击按钮的信号
    while (1) {
        if (Window::havemsg()) {
            m_msg = Window::getmsg();
            if (m_msg.x >= 0 && m_msg.x <= 68 && m_msg.y >= 0 && m_msg.y <= 83) {
                if (m_msg.message == WM_LBUTTONDOWN) { //点击返回键，回到查询输入框页面
                    return 0; //返回0，在pathShowGujia中进入case 0，退出到searchPathGujia()，显示路径查询输入框页面
                }
            }

            btn1.setmsg(m_msg);
            if (btn1.isCliked()) { //点击了步行按钮
                return 1;//返回1，在pathShowGujia中进入case 1，调用步行页面
            }
            btn2.setmsg(m_msg);
            if (btn2.isCliked()) { //点击了骑行按钮
                return 2;//返回2，在pathShowGujia中进入case 2，调用骑行页面
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 175 && m_msg.y <= 252 && 1 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线1并点击它
                    onePathShow(begin, end, pathlength[0], allpaths[0], BusVelocity, 1);
                    //调用onePathShow显示路线1详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 279 && m_msg.y <= 356 && 2 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线2并点击它
                    onePathShow(begin, end, pathlength[1], allpaths[1], BusVelocity, 0);
                    //调用onePathShow显示路线2详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 383 && m_msg.y <= 460 && 3 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线3并点击它
                    onePathShow(begin, end, pathlength[2], allpaths[2], BusVelocity, 0);
                    //调用onePathShow显示路线3详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 487 && m_msg.y <= 564 && 4 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线4并点击它
                    onePathShow(begin, end, pathlength[3], allpaths[3], BusVelocity, 0);
                    //调用onePathShow显示路线4详细信息函数
                }
            }

            if (m_msg.x >= 30 && m_msg.x <= 345 && m_msg.y >= 591 && m_msg.y <= 668 && 5 <= pathlength.size()) {
                if (m_msg.message == WM_LBUTTONDOWN) { //若存在路线5并点击它
                    onePathShow(begin, end, pathlength[4], allpaths[4], BusVelocity, 0);
                    //调用onePathShow显示路线5详细信息函数
                }
            }
        }
    }
}


//某条路径的详细信息显示页面，参数为路径及路径长度
void System::onePathShow(string beginpl, string endpl, double len, vector<Dot*>path, double speed, bool isshort)
{
    setbkcolor(RGB(255, 255, 255));
    cleardevice();
    //顶栏设置
    setfillcolor(RGB(130, 226, 255));
    fillroundrect(0, 0, 375, 83, 0, 0);
    settextcolor(RGB(0, 72, 125));
    settextstyle(36, 0, "黑体");//设置文本大小，垂直压缩，字体
    setbkmode(TRANSPARENT);//去除文字背景
    outtextxy(152, 20, "路径");
    IMAGE retn;
    loadimage(&retn, "./返回.png", 16, 29);
    putimage(25, 27, &retn);


    //地图设置
    IMAGE whumap;
    loadimage(&whumap, "./武大地图.png", 375, 612);
    putimage(0, 83, &whumap);
    auto it1 = SceneryKu.find(beginpl);
    auto it2 = SceneryKu.find(endpl);
    DrawPath(path, isshort);


    setfillcolor(RGB(255, 255, 255));
    fillroundrect(0, 601, 375, 862, 35, 35);
    //路径信息
    Time t1, t2;
    int crossNum = 0;//十字路口个数
    CalculateRootTime(path, t1, t2, speed, crossNum);//t1为到达时间t2为花费时间


    string text1 = "全程  ";
    int l = len * 7.5;
    string length = to_string(l);
    text1.append(length);
    text1.append("m"); //“全程  xxm”

    string text2 = "所需时间  ";
    int time = t2.Gethour();
    string times = to_string(time);
    text2.append(times);
    text2.append("时");
    time = t2.Getminute();
    times = to_string(time);
    text2.append(times);
    text2.append("分");
    time = t2.Getsecond();
    times = to_string(time);
    text2.append(times);
    text2.append("秒");//“所需时间  xx时xx分xx秒”

    string text3 = "预计到达时间  ";
    time = t1.Gethour();
    times = to_string(time);
    text3.append(times);
    text3.append("时");
    time = t1.Getminute();
    times = to_string(time);
    text3.append(times);
    text3.append("分");
    time = t1.Getsecond();
    times = to_string(time);
    text3.append(times);
    text3.append("秒");//“预计到达时间  xx时xx分xx秒”

    string text4 = "途径十字路口个数  ";
    string crossN = to_string(crossNum);
    text4.append(crossN);
    text4.append("个");//“途径十字路口个数  xx个”

    settextcolor(RGB(0, 0, 0));
    settextstyle(32, 0, "黑体");//设置文本大小，垂直压缩，字体
    setbkmode(TRANSPARENT);//去除文字背景
    outtextxy(32, 613, text1.c_str());
    outtextxy(32, 659, text2.c_str());

    settextcolor(RGB(0, 0, 0));
    settextstyle(24, 0, "黑体");//设置文本大小，垂直压缩，字体
    setbkmode(TRANSPARENT);//去除文字背景
    outtextxy(32, 705, text3.c_str());
    outtextxy(32, 741, text4.c_str());

    string route = beginpl;
    route.append("->");
    route.append(endpl);
    outtextxy(32, 775, route.c_str());//起点->终点



    //持续循环直到获取鼠标点击按钮的信号
    while (1) {
        if (Window::havemsg()) {
            m_msg = Window::getmsg();
            if (m_msg.x >= 0 && m_msg.x <= 68 && m_msg.y >= 0 && m_msg.y <= 83) {
                if (m_msg.message == WM_LBUTTONDOWN) { //点击返回键，回到路径卡片框页面
                    return;
                }
            }
        }
    }
}
